Git Submoduleで管理しているコードをLambda Layersで使ってみる
AWS Lambda LayersとAWS Lambdaを利用しています。それぞれ異なるGitリポジトリで管理しており、ローカルのUnit Testで参照するために、Git Submoduleを利用しています。
このとき、「Lambda Layers Repository」と「Lambda Repository」をそれぞれデプロイしていたのですが、「Git Submodule使ってるんだし、Lambda Repositoryだけのデプロイで良いのでは?」と思ったので、試してみました。 (本記事では簡略版で試しています。)
おすすめの方
- Git Submoduleを利用したい方
- Lambda Layersを利用したい方
- Git SubmoduleとLambda Layersを合わせて利用したい方
Lambda Layersを作成する
Layers用のリポジトリを作成する
- blog-lambda-layers.git
リポジトリの作成後、git cloneしておきます。
Layers用のコードを作成する
cd blog-lambda-layers mkdir -p src/layers touch src/layers/hello.py
コードは下記です。
def message(): return 'hello world'
コード作成後、git commit & git pushしておきます。
Lambdaを作成する
sam init
sam init \ --runtime python3.9 \ --name sam-layers-test \ --app-template hello-world \ --no-tracing \ --no-application-insights \ --package-type Zip
作成後、Gitリポジトリ化しておきます。
cd sam-layers-test git init git add . git commit -m "first commit"
Git Submoduleを追加する
さきほどpushしておいたLayers用のリポジトリをSubmoduleとして追加します。
git submodule add git@github.com:cm-fujii/blog-lambda-layers.git
SAMテンプレート
Lambda Layersのコードの場所は、Git Submoduleとして追加したリポジトリを指定します。
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: sam-layers-test Resources: BlogLayer: Type: AWS::Serverless::LayerVersion Metadata: BuildMethod: python3.9 Properties: LayerName: blog-layer ContentUri: blog-lambda-layers/src/layers/ CompatibleRuntimes: - python3.9 HelloWorldFunction: Type: AWS::Serverless::Function Properties: CodeUri: hello_world/ Handler: app.lambda_handler Runtime: python3.9 Timeout: 5 Layers: - !Ref BlogLayer Architectures: - x86_64 Events: HelloWorld: Type: Api Properties: Path: /hello Method: get HelloWorldFunctionLogGroup: Type: AWS::Logs::LogGroup Properties: LogGroupName: !Sub /aws/lambda/${HelloWorldFunction} Outputs: HelloWorldApi: Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/"
コード
Layersに存在する関数を呼びます。
import json from hello import message def lambda_handler(event, context): return { "statusCode": 200, "body": json.dumps({ "message": message(), }), }
LayersとLambdaをデプロイして、動作を確認する
デプロイ
sam build sam deploy \ --guided \ --region ap-northeast-1 \ --stack-name sam-layers-test-Stack
動作を確認する
バッチリですね。
curl https://xxx.execute-api.ap-northeast-1.amazonaws.com/Prod/hello/ {"message": "hello world"}
Layersのコードを更新して、デプロイして、動作を確認する
Layersのコードを更新する
def message(): return 'hello world!!!!!! Yeah!!!!!'
保存したあと、commit & push します。
git commit -am "update message()" git push origin main
Lambdaを管理するリポジトリを確認する
さきほど、Git Submoduleとして利用しているリポジトリに変更をpushしましたが、ローカルリポジトリは変更されていません。 そのため、最新のコードではありません。
$ cat blog-lambda-layers/src/layers/hello.py def message(): return 'hello world'
Git Submoduleを更新する
Git Submoduleの更新にはいくつかの方法がありますが、今回は下記コマンドを実行します。 (少し手間ですが、明示的に更新するので分かりやすいと思います。)
cd blog-lambda-layers git pull origin main cd ..
念のためコードを確認すると、更新されています。
$ cat blog-lambda-layers/src/layers/hello.py def message(): return 'hello world!!!!!! Yeah!!!!!'
デプロイ
sam build sam deploy
動作を確認する
最新のLayersのコードが利用されています。やったね!
curl https://xxx.execute-api.ap-northeast-1.amazonaws.com/Prod/hello/ {"message": "hello world!!!!!! Yeah!!!!!"}
さいごに
Git Submoduleを利用したLayersコードの管理を試してみました。 どなたかの参考になれば幸いです。